package com.zy.cat.common.utils.dtk;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.zy.cat.common.utils.CalculateUtil;
import com.zy.cat.entity.dtk.Goods;
import com.zy.cat.entity.dtk.GoodsRank;
import com.zy.cat.entity.dtk.GoodsTopic.Opts;
import com.zy.cat.entity.dtk.GoodsConvert;
import com.zy.cat.entity.dtk.GoodsDetail;
import com.zy.cat.entity.dtk.SuperCategory;
import com.zy.cat.entity.dtk.resp.GoodsActivityListResp;
import com.zy.cat.entity.dtk.resp.GoodsActivityResp;
import com.zy.cat.entity.dtk.resp.GoodsListResp;
import com.zy.cat.entity.dtk.resp.GoodsTopicListResp;
import com.zy.cat.entity.resp.ResultPage;

import lombok.extern.slf4j.Slf4j;

/**
 * 大淘客API
 * 
 * @author Link
 * @date 2019-06-28 08:52
 */
@Slf4j
public class DTKAPI {
	private String app_key = "5d7603c948b71";
	private String app_secret = "df3208639648b1080111648b96b96649";
	
	
	private String pid = "mm_327490036_345300428_108351550396";
	private String url = "https://openapi.dataoke.com/api/";

	private DTKAPI(String app_key, String app_secret, String pid) {
		super();
		this.app_key = app_key;
		this.pid = pid;
		this.app_secret = app_secret;
	}

	public static void main(String[] args) {
	 
		
//		String startTime = LocalDateTime.now().minusMinutes(20)
//		.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//String endTime = LocalDateTime.now().plusMinutes(5).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 
//		
		String goods_id="604318861273";
//		GoodsDetail shopDetail = DTKAPI.getInstance(0).getShopDetail(goods_id, goods_id);
//		log.info("-getShopDetail-->" +JSON.toJSONString(shopDetail, true));
//		System.out.println(JSON.toJSONString(shopDetail));
//		
//		SuperCategory sc=DTKAPI.getInstance(0).getSuperCategory();
//		log.info("-getSuperCategory-->" +JSON.toJSONString(sc.getData(), true));
		
//		Goods goodis=DTKAPI.getInstance(0).getGoodsList("1", 50, "", "111740");
//		log.info("-getGoodsList-->" +JSON.toJSONString(goodis.getData(),true));
//		System.out.println(JSON.toJSONString(goodis));
		
//		Goods goodis=DTKAPI.getInstance(0).pullGoodsByTime("1", 200,startTime, endTime);
//		log.info("-pullGoodsByTime-->" +JSON.toJSONString(goodis.getData().getList(),true));
		

//		Goods goodis=DTKAPI.getInstance(0).getNewestGoods("1", 200, startTime, endTime,"1","93980");
//		log.info("-getNewestGoods-->" +JSON.toJSONString(goodis,true));
		
//		Goods goodis=DTKAPI.getInstance(0).getStaleGoodsByTime("1", 200, "2019-09-18 00:00:01", "2019-09-18 10:00:01");
//		log.info("-pullGoodsByTime-->" +JSON.toJSONString(goodis.getData()));
		
//		Goods goodis= DTKAPI.getInstance(0).getGoodsNine("1",10,"1" );
//		log.info("-getGoodsNine-->" +JSON.toJSONString(goodis.getData()));
		
//		GoodsRank goodis= DTKAPI.getInstance(0).getGoodsRankingList(3,"1");
//		log.error("-getGoodsRankingList-->" +JSON.toJSONString(goodis));
		
		ResultPage<GoodsListResp> searchGoods = DTKAPI.getInstance(0).searchGoods("0", "运动无线蓝牙耳机双耳5.0入耳头戴式颈挂脖式跑步安卓苹果通用超小型适用于oppo华为iphone小米超长待机续航", "total_sales_des", "1", 10);
		log.info("-searchGoods-->" +JSON.toJSONString(searchGoods));
		
//		List<Map<String,Object>> list = DTKAPI.getInstance(0).getSearchWord(1, "女童凉鞋2019新款时尚韩版夏季小公主鞋软底儿童鞋女中大童罗马鞋");
//		log.info("-searchGoods-->" +JSON.toJSONString(list));

//		List<GoodsListResp> goodsLike = DTKAPI.getInstance(0).getGoodsLike("606610594670",10);
//		log.info("-getGoodsLike-->" +JSON.toJSONString(goodsLike));
		
//		DTKAPI.getInstance(0).getGoodsTopicList("1064","1",10);
////		log.info("-getGoodsLike-->" +JSON.toJSONString(goodsLike));
		
//		GoodsActivityListResp actsGoodsList = DTKAPI.getInstance(0).getActsGoodsList("6","1",10);
//		System.out.println(JSON.toJSONString(actsGoodsList));
//		GoodsActivityResp resp = DTKAPI.getInstance(0).getActs();
//		System.out.println(JSON.toJSONString(resp));
		
//		DTKAPI.getInstance(1).getDDQGoodsList("2020-04-22 17:00:00");
	}

	/**
	 * 
	 * @author Link
	 * @date 2019-06-28 08:53
	 * @param type 0.测试账户
	 * @return
	 */
	public static DTKAPI getInstance(int type) {
		String app_key = "5d7603c948b71";
		String app_secret = "df3208639648b1080111648b96b96649";
		String pid = "mm_327490036_345300428_108351550396";

		if (type == 1) {
			app_key = "5d7603c948b71";
			app_secret = "df3208639648b1080111648b96b96649";
			pid = "mm_327490036_345300428_108351550396";
		}
		return new DTKAPI(app_key, app_secret, pid);
	}

	/**
	 * 
	 * @info
	 * @author Link
	 * @date 2019-09-09 16:04
	 * @param id      大淘客商品id，请求时id或goodsId必填其中一个，若均填写，将优先查找当前单品id
	 * @param goodsId id或goodsId必填其中一个，若均填写，将优先查找当前单品id
	 * @return TKShopDetailResp
	 */
	public GoodsDetail getShopDetail(String id, String goodsId) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.2.2 */
		paraMap.put("version", "v1.2.2");
		/* 大淘客商品id，请求时id或goodsId必填其中一个，若均填写，将优先查找当前单品id */
//		paraMap.put("id", id);
		/* id或goodsId必填其中一个，若均填写，将优先查找当前单品id */
		paraMap.put("goodsId", goodsId);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		System.out.println(JSON.toJSONString(paraMap));
		String json = HttpUtils.sendGet(url + "goods/get-goods-details", paraMap);
		log.info("-getShopDetail-->" + json);
		return JSON.parseObject(json, GoodsDetail.class);
	}
	
	 
	public GoodsConvert shopConvert( String goodsId,String rid) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 淘宝商品id */
		paraMap.put("goodsId", goodsId);
		/* 优惠券ID */
//		paraMap.put("couponId", goodsId);
		/* 推广位ID */
		paraMap.put("pid", this.pid);
		/* 渠道id */
 		paraMap.put("channelId", rid);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "tb-service/get-privilege-link", paraMap);
//		log.info("-shopconvert-->" + json);
		return JSON.parseObject(json,GoodsConvert.class);
	}
	/**
	 * 
	 * @info 获取所有分类信息
	 * @author Link
	 * @date 2019-09-18 09:31
	 * @return
	 */
	public SuperCategory getSuperCategory(){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "category/get-super-category", paraMap);
//		log.info("-getSuperCategory-->"+json);
		return JSON.parseObject(json,SuperCategory.class);
	}
//	@SuppressWarnings("unchecked")
//	public  DTKResponse<SuperCategory> getSuperCategory(){
//		TreeMap<String, String> paraMap = new TreeMap<String, String>();
//		/* 应用分配的appKey */
//		paraMap.put("appKey", this.app_key);
//		/* 当前版本： v1.1.0 */
//		paraMap.put("version", "v1.1.0");
//		/* 签名信息 */
//		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
//		String json = new HttpUtils().sendGet(url + "category/get-super-category", paraMap);
//		log.info("-getSuperCategory-->"+json);
//		return JSON.parseObject(json, new DTKResponse<SuperCategory>().getClass());
//	}
	
	/**
	 * 
	 * @info 商品列表:构建商品库，数据入库，建议您首次获取全量商品时调用该接口，若您需要更新商品库中的商品数据（如销量、领券量等）请使用商品更新接口，若您需要获取更多增量商品请通过定时拉取接口获取新的商品信息，若您需要在库中删除失效商品，请使用失效商品接口进行查询后删除
	 * @author Link
	 * @date 2019-09-18 10:09
	 * @param pageId 	首次传入1，后续传入接口第一次返回的pageid
	 * @param pageSize 	默认为100，可选范围：10,50,100,200，如果小于10按10处理，大于200按照200处理，其它非范围内数字按100处理
	 * @param cids		大淘客的一级分类id，如果需要传多个，以英文逗号相隔，如：”1,2,3”。当一级类目id和二级类目id同时传入时，会自动忽略二级类目id
	 * @param subcid	大淘客的二级类目id，通过超级分类API获取。仅允许传一个二级id，当一级类目id和二级类目id同时传入时，会自动忽略二级类目id
	 * @return
	 */
	public Goods getGoodsList(String pageId,int pageSize,String cids,String subcid){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.1 */
		paraMap.put("version", "v1.1.1");
		/* 每页条数 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 排序方式：默认为0，0-综合排序，1-商品上架时间从高到低，2-销量从高到低，3-领券量从高到低，4-佣金比例从高到低，5-价格（券后价）从高到低，6-价格（券后价）从低到高 */
		paraMap.put("sort", "0");
		/* 大淘客的一级分类id，如果需要传多个，以英文逗号相隔，如：”1,2,3”。当一级类目id和二级类目id同时传入时，会自动忽略二级类目id */
		if(StringUtils.isNotBlank(cids)) {
			paraMap.put("cids", cids);
		}
		/* 二级类目id */
		if(StringUtils.isNotBlank(subcid)) {
			paraMap.put("subcid", subcid);
		}
		/* 是否聚划算 */
		paraMap.put("juHuaSuan", "0");
		/* 是否淘抢购 */
		paraMap.put("taoQiangGou", "0");
		/* 是否天猫商品 */
		paraMap.put("tmall", "0");
		/* 是否天猫超市商品 */
		paraMap.put("tchaoshi", "0");
		/* 	是否金牌卖家 */
		paraMap.put("goldSeller", "0");
		/* 是否海淘商品 */
		paraMap.put("haitao", "0");
		/* 是否预告商品 */
		paraMap.put("pre", "0");
		/* 价格（券后价）下限 */
//		paraMap.put("priceLowerLimit", "10");
		/* 价格（券后价）上限 */
// 		paraMap.put("priceUpperLimit", "0");
		/* 最低优惠券面额 */
//		paraMap.put("couponPriceLowerLimit", "1");
		/* 最低佣金比率 */
		paraMap.put("commissionRateLowerLimit", "10");
		/* 最低月销量 */
		paraMap.put("monthSalesLowerLimit", "0");
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/get-goods-list", paraMap);
//		log.info("-getGoodsList-->"+json);
		return JSON.parseObject(json, Goods.class);
		
	}
	
	/**
	 * 
	 * @info 定时拉取,首次通过商品列表获取商品后，后续商品即可使用定时拉取接口进行增量更新，开始时间建议为您上次调用的时间，结束时间为当前时间，可以无重复拉取全库商品
	 * @author Link
	 * @date 2019-09-18 10:26
	 * @param pageId 	首次传入1，后续传入接口第一次返回的pageid
	 * @param pageSize 	默认为100，可选范围：10,50,100,200，如果小于10按10处理，大于200按照200处理，其它非范围内数字按100处理
	 * @param startTime	默认为yy-mm-dd hh:mm:ss，商品下架的时间大于等于开始时间
	 * @param endTime	默认为请求的时间，商品下架的时间小于等于结束时间
	 * @return
	 */
	public Goods pullGoodsByTime(String pageId,int pageSize,String startTime,String endTime){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 每页条数 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 排序方式：默认为0，0-综合排序，1-商品上架时间从高到低，2-销量从高到低，3-领券量从高到低，4-佣金比例从高到低，5-价格（券后价）从高到低，6-价格（券后价）从低到高 */
		paraMap.put("sort", "0");
		/* 	开始时间：默认为yyyy-mm-dd hh:mm:ss，商品下架的时间大于等于开始时间，开始时间需要在当日 */
		paraMap.put("startTime", startTime.replace(" ", "%20"));
		/* 结束时间:默认为请求的时间，商品下架的时间小于等于结束时间，结束时间需要在当日 */
		paraMap.put("endTime", endTime.replace(" ", "%20"));
		 
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/pull-goods-by-time", paraMap);
//		log.info("-pullGoodsByTime-->"+json);
		return JSON.parseObject(json, Goods.class);
	}
	
	
	/**
	 * 
	 * @info 商品更新:商品的部分信息会在商品售卖及推广过程中有所变更，您可以通过该接口对销量、领券量等数据进行实时更新
	 * @author Link
	 * @date 2019-09-18 10:26
	 * @param pageId 	首次传入1，后续传入接口第一次返回的pageid
	 * @param pageSize 	默认为100，可选范围：10,50,100,200，如果小于10按10处理，大于200按照200处理，其它非范围内数字按100处理
	 * @param startTime	默认为yy-mm-dd hh:mm:ss，商品下架的时间大于等于开始时间
	 * @param endTime	默认为请求的时间，商品下架的时间小于等于结束时间
	 * @param cids		大淘客的一级分类id，如果需要传多个，以英文逗号相隔，如：”1,2,3”。当一级类目id和二级类目id同时传入时，会自动忽略二级类目id
	 * @param subcid	大淘客的二级类目id，通过超级分类API获取。仅允许传一个二级id，当一级类目id和二级类目id同时传入时，会自动忽略二级类目id
	 * @return 
	 */
	public Goods getNewestGoods(String pageId,int pageSize,String startTime,String endTime,String cids,String subcid){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 每页条数 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 	开始时间：默认为yyyy-mm-dd hh:mm:ss，商品下架的时间大于等于开始时间，开始时间需要在当日 */
		paraMap.put("startTime", startTime.replace(" ", "%20"));
		/* 结束时间:默认为请求的时间，商品下架的时间小于等于结束时间，结束时间需要在当日 */
		paraMap.put("endTime", endTime.replace(" ", "%20"));
		/* 排序方式：默认为0，0-综合排序，1-商品上架时间从高到低，2-销量从高到低，3-领券量从高到低，4-佣金比例从高到低，5-价格（券后价）从高到低，6-价格（券后价）从低到高 */
		paraMap.put("sort", "0");
		/* 大淘客的一级分类id，如果需要传多个，以英文逗号相隔，如：”1,2,3”。当一级类目id和二级类目id同时传入时，会自动忽略二级类目id */
		if(StringUtils.isNotBlank(cids)) {
			paraMap.put("cids", cids);
		}
		/* 二级类目id */
		if(StringUtils.isNotBlank(subcid)) {
			paraMap.put("subcid", subcid);
		}
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/get-newest-goods", paraMap);
//		log.info("-pullGoodsByTime-->"+json);
		return JSON.parseObject(json, Goods.class);
	}
	
	/**
	 * 
	 * @info 失效商品:根据指定时间段返回该时间段内（开始时间和结束时间须为当日）因任何原因在大淘客下架商品，建议您每10分钟更新一次
	 * @author Link
	 * @date 2019-09-18 10:26
	 * @param pageId 	首次传入1，后续传入接口第一次返回的pageid
	 * @param pageSize 	默认为100，可选范围：10,50,100,200，如果小于10按10处理，大于200按照200处理，其它非范围内数字按100处理
	 * @param startTime	默认为yy-mm-dd hh:mm:ss，商品下架的时间大于等于开始时间
	 * @param endTime	默认为请求的时间，商品下架的时间小于等于结束时间
	 * @return
	 */
	public Goods getStaleGoodsByTime(String pageId,int pageSize,String startTime,String endTime ){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 每页条数 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 	开始时间：默认为yyyy-mm-dd hh:mm:ss，商品下架的时间大于等于开始时间，开始时间需要在当日 */
		paraMap.put("startTime", startTime.replace(" ", "%20"));
		/* 结束时间:默认为请求的时间，商品下架的时间小于等于结束时间，结束时间需要在当日 */
		paraMap.put("endTime", endTime.replace(" ", "%20"));
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/get-stale-goods-by-time", paraMap);
//		log.info("-getStaleGoodsByTime-->"+json);
		return JSON.parseObject(json, Goods.class);
	}
	/**
	 * 
	 * @info 九块九包邮
	 * @author Link
	 * @date 2019-09-19 14:28
	 * @param pageId	常规分页方式，请直接传入对应页码
	 * @param pageSize	默认100 ，可选范围：10,50,100，如果小于10按10处理，大于100按照100处理，其它非范围内数字按100处理
	 * @param nineCid	类目id，分类id请求详情：-1-精选，1 -居家百货，2 -美食，3 -服饰，4 -配饰，5 -美妆，6 -内衣，7 -母婴，8 -箱包，9 -数码配件，10 -文娱车品
	 * @return
	 */
	public Goods getGoodsNine(String pageId,int pageSize,String nineCid ){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 每页条数 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 	类目id，分类id请求详情：-1-精选，1 -居家百货，2 -美食，3 -服饰，4 -配饰，5 -美妆，6 -内衣，7 -母婴，8 -箱包，9 -数码配件，10 -文娱车品 */
		paraMap.put("nineCid", nineCid);
 
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/nine/op-goods-list", paraMap);
//		log.info("-getGoodsNine-->"+json);
		return JSON.parseObject(json, Goods.class);
	}
	
	/**
	 * 
	 * @info 获取 各大榜单数据
	 * @author Link
	 * @date 2019-09-19 14:44
	 * @param rankType	1.实时榜 2.全天榜 3.热推榜 4.复购榜 5.热词飙升榜 6.热词排行榜 7.综合热搜榜
	 * @param cid		大淘客一级类目id，默认为1
	 * @return
	 */
	public GoodsRank getGoodsRankingList(int rankType, String cid ){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.1.2");
		/* 1.实时榜 2.全天榜 3.热推榜 4.复购榜 5.热词飙升榜 6.热词排行榜 7.综合热搜榜 */
		paraMap.put("rankType", ""+rankType);
		/* 	大淘客一级类目id，默认为1，仅对实时榜单、全天榜单有效 */
		paraMap.put("cid", cid+"");
		/* 当前版本： v1.1.2 */
		paraMap.put("version", "v1.1.2");
		/* 1.实时榜 2.全天榜 3.热推榜（热推榜分类无效）4.复购榜 */
		paraMap.put("rankType", ""+rankType);
		/* 	大淘客一级类目id，默认为1 */
		paraMap.put("cid", cid);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/get-ranking-list", paraMap);
//		log.info("-getGoodsRankingList-->"+json);
		return JSON.parseObject(json, GoodsRank.class);
	}
	
	/**
	 * 大淘客超级搜索
	 * @param type 搜索类型，0-综合结果，1-大淘客商品，2-联盟商品	
	 * @param keyWords 关键词搜索	
	 * @param sort 排序字段，排序字段信息 销量（total_sales） 价格（price），排序_des（降序），排序_asc（升序）
	 * @param pageId 页码	
	 * @return
	 */
	public ResultPage<GoodsListResp> searchGoods(String type,String keyWords,String sort,String pageId,Integer pageSize) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.2.1 */
		paraMap.put("version", "v1.2.1");
		/* 搜索类型,0-综合结果，1-大淘客商品，2-联盟商品 */
		paraMap.put("type", ""+type);
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 	每页条数,默认为20，最大值100 */
		paraMap.put("pageSize", pageSize+"");
		/* 	关键词搜索 */
		paraMap.put("keyWords", keyWords.replace(" ", ""));
		/* 	排序字段,排序字段信息 销量（total_sales） 价格（price），排序_des（降序），排序_asc（升序） */
		paraMap.put("sort", sort);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/list-super-goods", paraMap);
//		log.info("-searchGoods-->"+json);
		JSONObject object = JSON.parseObject(json);
		String code = object.getString("code");
		//请求失败
		if ("-1".equals(code)||"10007".equals(code) ||object.getJSONObject("data")==null) {
			log.error("searchGoods:"+object.getString("msg"));
			return null;
		}
		JSONObject dataJson = object.getJSONObject("data");
		List<GoodsListResp> list = JSON.parseArray(dataJson.getString("list"), GoodsListResp.class);
		JSONArray jsonArray = dataJson.getJSONArray("list");
		for (int i = 0; i < jsonArray.size(); i++) {
			GoodsListResp goods = list.get(i);
			double actualPrice = goods.getActualPrice();
			Double commissionRate = jsonArray.getJSONObject(i).getDouble("commissionRate");
			goods.setFcode(CalculateUtil.getRebateAmount(actualPrice, commissionRate));
		}
		ResultPage<GoodsListResp> resultPage=new ResultPage<>();
		resultPage.setList(list);
		resultPage.setPageNum(Integer.parseInt(dataJson.getString("pageId")));
		resultPage.setTotal(dataJson.getInteger("totalNum"));
		return resultPage;
	}

	/**
	 * 获取热搜记录
	 * @return
	 */
	public List<String> hotSearchList() {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.0.1 */
		paraMap.put("version", "v1.0.1");
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "category/get-top100", paraMap);
//		log.info("-hotSearchList-->"+json);
		JSONObject object = JSON.parseObject(json);
		String code = object.getString("code");
		//请求失败
		if ("-1".equals(code) || object.getJSONObject("data")==null) {
			log.error("hotSearchList:"+object.getString("msg"));
		}
		JSONObject dataJson = object.getJSONObject("data");
		return JSON.parseArray(dataJson.getString("hotWords"), String.class);
	}

	/**
	 * 联想词查询
	 * @param type
	 * @param keyWords
	 * @return
	 */
	public List<Map<String, Object>> getSearchWord(int type, String keyWords) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.0.1 */
		paraMap.put("version", "v1.0.2");
		/* 	关键词搜索 */
		paraMap.put("keyWords", keyWords);
		/* 当前搜索API类型：1.大淘客搜索 2.联盟搜索 3.超级搜索 */
		paraMap.put("type", ""+type);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap,app_secret));
		try {
			paraMap.put("keyWords", URLEncoder.encode(keyWords, "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String json = HttpUtils.sendGet(url + "goods/search-suggestion", paraMap);
//		log.info(json);
		JSONObject object = JSON.parseObject(json);
		String code = object.getString("code");
		//请求失败
		if ("-1".equals(code) || object.getJSONArray("data")==null) {
			log.error("getSearchWord:"+object.getString("msg")+",keyWords:"+keyWords.replace(" ", ""));
			return null;
		}
		JSONArray jsonArray = object.getJSONArray("data");
		List<Map<String,Object>> list=new ArrayList<>();
		for (int i = 0; i < jsonArray.size(); i++) {
			Map<String, Object> map = JSON.parseObject(jsonArray.getString(i), new TypeReference<Map<String,Object>>(){});
			list.add(map);
		}
		return list;
	}

	/**
	 * 获取猜你喜欢列表数据
	 * @param id 大淘客的商品id	
	 * @param size 每页条数	
	 * @return
	 */
	public List<GoodsListResp> getGoodsLike(String id, int size) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.1 */
		paraMap.put("version", "v1.1.1");
		/* 	关键词搜索 */
		paraMap.put("id", id);
		/* 当前搜索API类型：1.大淘客搜索 2.联盟搜索 3.超级搜索 */
		paraMap.put("size", ""+size);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/list-similer-goods-by-open", paraMap);
//		log.info(json);
		JSONObject object = JSON.parseObject(json);
		String code = object.getString("code");
		//请求失败
		if ("-1".equals(code)) {
			log.error("getGoodsLike:"+object.getString("msg"));
		}
		List<GoodsListResp> list = JSON.parseArray(object.getString("data"), GoodsListResp.class);
		JSONArray jsonArray = object.getJSONArray("data");
		if (jsonArray==null || list==null) {
			return null;
		}
		for (int i = 0; i < jsonArray.size(); i++) {
			GoodsListResp goods = list.get(i);
			double actualPrice = goods.getActualPrice();
			Double commissionRate = jsonArray.getJSONObject(i).getDouble("commissionRate");
			goods.setFcode(CalculateUtil.getRebateAmount(actualPrice, commissionRate));
		}
		return list;
	}

	/**
	 * 获取精选专辑
	 * @return
	 */
	public List<Opts> getGoodsTopic() {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本：v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/topic/catalogue", paraMap);
//		log.info(json);
		JSONObject object = JSON.parseObject(json);
		String code = object.getString("code");
		//请求失败
		if ("-1".equals(code)) {
			log.error("getGoodsTopic:"+object.getString("msg"));
		}
		List<Opts> list = JSON.parseArray(object.getString("data"), Opts.class);
		return list;
	}

	public GoodsTopicListResp getGoodsTopicList(String topicId, String pageId, int pageSize) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本：v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 	每页条数,默认为20，最大值100 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	专辑id*/
		paraMap.put("topicId", ""+topicId);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/topic/goods-list", paraMap);
		GoodsTopicListResp resp = JSON.parseObject(json, GoodsTopicListResp.class);
		JSONObject object = JSON.parseObject(json);
		JSONArray jsonArray = object.getJSONObject("data").getJSONArray("list");
		List<GoodsListResp> list = resp.getData().getList();
		for (int i = 0; i < jsonArray.size(); i++) {
			GoodsListResp goods = list.get(i);
			double actualPrice = goods.getActualPrice();
			Double commissionRate = jsonArray.getJSONObject(i).getDouble("commissionRate");
			goods.setFcode(CalculateUtil.getRebateAmount(actualPrice, commissionRate));
		}
		return resp;
	}

	/**
	 * 获取热门活动
	 * @return
	 */
	public GoodsActivityResp getActs() {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本：v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/activity/catalogue", paraMap);
//		System.out.println(json);
		return JSON.parseObject(json, GoodsActivityResp.class);
	}

	/**
	 * 获取活动商品
	 * @param activityId 活动id	
	 * @param pageId 分页id	
	 * @param pageSize 每页条数	
	 * @return
	 */
	public GoodsActivityListResp getActsGoodsList(String activityId, String pageId, int pageSize) {
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本：v1.1.0 */
		paraMap.put("version", "v1.1.0");
		/* 	分页id 默认为1，支持传统的页码分页方式和scroll_id分页方式，根据用户自身需求传入值。示例1：商品入库，则首次传入1，后续传入接口第一次返回的pageid，接口将持续返回符合条件的完整商品列表，该方式可以避免入口商品重复；示例2：根据pagesize和totalNum计算出总页数，按照需求返回指定页的商品（该方式可能在临近页取到重复商品） */
		paraMap.put("pageId", pageId);
		/* 	每页条数,默认为20，最大值100 */
		paraMap.put("pageSize", ""+pageSize);
		/* 	专辑id*/
		paraMap.put("activityId",activityId);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		String json = HttpUtils.sendGet(url + "goods/activity/goods-list", paraMap);
//		System.out.println(json);
		GoodsActivityListResp resp = JSON.parseObject(json, GoodsActivityListResp.class);
		if (resp.getData()==null) {
			return resp;
		}
		JSONObject object = JSON.parseObject(json);
		JSONArray jsonArray = object.getJSONObject("data").getJSONArray("list");
		List<GoodsListResp> list = resp.getData().getList();
		for (int i = 0; i < jsonArray.size(); i++) {
			GoodsListResp goods = list.get(i);
			double actualPrice = goods.getActualPrice();
			Double commissionRate = jsonArray.getJSONObject(i).getDouble("commissionRate");
			goods.setFcode(CalculateUtil.getRebateAmount(actualPrice, commissionRate));
		}
		return resp;
	}
	
	/**
	 * 
	 * @info 获取 各大榜单数据
	 * @author Link
	 * @date 2019-09-19 14:44
	 * @param rankType	1.实时榜 2.全天榜 3.热推榜 4.复购榜 5.热词飙升榜 6.热词排行榜 7.综合热搜榜
	 * @param cid		大淘客一级类目id，默认为1
	 * @return
	 */
	public GoodsRank getDDQGoodsList(String roundTime){
		TreeMap<String, String> paraMap = new TreeMap<String, String>();
		/* 应用分配的appKey */
		paraMap.put("appKey", this.app_key);
		/* 当前版本： v1.1.0 */
		paraMap.put("version", "v1.2.0");
		/* 场次时间,默认为当前场次，场次时间输入方式：yyyy-mm-dd hh:mm:ss*/
		paraMap.put("roundTime", roundTime);
		/* 签名信息 */
		paraMap.put("sign", SignMD5Util.getSignStr(paraMap, this.app_secret));
		try {
			paraMap.put("roundTime", URLEncoder.encode(roundTime, "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		String json = HttpUtils.sendGet(url + "category/ddq-goods-list", paraMap);
//		log.info("-getGoodsRankingList-->"+json);
		System.out.println(json);
		return null;
	}
	
}
